import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * 1.使用关键字 interface 来定义接口
 * 2.接口不能被实例化
 * 3.接口当中的成员 默认是public static final
 * 4.接口当中的方法 不写也是默认为 public abstract的
 * 5.接口当中的方法 不能有具体的实现，但是从JDK8开始 可以写一个default修饰的方法
 * 6.接口当中不能有构造方法
 * 7.接口需要被类实现，使用关键字implements
 * 8.接口当中 可以有 static修饰的方法!
 * */
interface IShape {
    void draw();
}

class Rect implements IShape {

    @Override
    public void draw() {       // 必须加public，因为子类的访问权限要大于父类的，默认是default
        System.out.println("Rect");
    }
}

// ----------------------------------------------------------
// java中没有多继承，但是可以实现多个接口
abstract class Animal7 {
    public String name;

    public Animal7(String name) {
        this.name = name;
    }
}

// 因为animal不一定都是跑的，鱼就不会跑，因此run方法不能放在Animal抽象类里面
interface IRunning {
    public void run();
}

class Dog7 extends Animal7 implements IRunning {
    Dog7(String name) {
        super(name);
    }
    @Override
    public void run() {
        System.out.println(name + " is running!");
    }
}
// 一个类实现多个接口时，每个接口中的抽象方法都必须实现，否则必须设置为抽象类

// ----------------------------------------------------------
// 接口间的继承：
interface A7 {
    void funcA();
}

interface B7 {
    void funcB();
}

interface C7 extends A7, B7 {
    void funcC();
}

// 必须实现 3 个接口各自的抽象方法
class CC implements C7 {

    @Override
    public void funcA() {

    }

    @Override
    public void funcB() {

    }

    @Override
    public void funcC() {

    }
}

//-----------------------------------------------------------------------------
// 类的比较，Compare:
class Student7 implements Comparable<Student7>{
    public String name;
    public int age;
    public int height;

    public Student7(String name, int age, int height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    @Override
    public int compareTo(Student7 o) {
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        } else {
            return 0;
        }
    }

    @Override
    public String toString() {
        return "Student7{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}

public class Class8_interface {
    public static void main(String[] args) {
        Student7[] st = new Student7[3];
        st[0] =  new Student7("xxx", 20, 100);
        st[1] =  new Student7("sss", 19, 99);
        st[2] =  new Student7("yyy", 21, 102);

        Arrays.sort(st);
        System.out.println(Arrays.toString(st));
    }
    public static void main2(String[] args) {
        Dog7 dog7 = new Dog7("dd");
        dog7.run();
    }
    public static void main1(String[] args) {
        IShape rt = new Rect();
        rt.draw();
    }
}
